using System;
using System.Data;
using System.Collections.Generic;
using System.Reflection;

namespace Serpis
{

    public class Persister : IPersister
    {	
		//persisterStorage diccionario = persisterStorage.Instance;
				
        public void Save (object model)
        {
			/*
			 * el table info nos proporciona los datos del modelos que forman parte de la base de datos
			 * el diccionario comprueba que no tenga ya una referencia a un tableInfo de ese modelo
			 */
			
			//tableInfo tableInfo = diccionario.getInfo(model);
			tableInfo tableInfo = new tableInfo(model.GetType());
			
			object id = tableInfo.PrimaryKey.GetValue(model, null);
			
			if(id == null || id.Equals("") || Convert.ToInt64(id) == 0)
					tableInfo.GetInsertCommand(model).ExecuteNonQuery();
				else
					tableInfo.GetUpdateCommand(model).ExecuteNonQuery();
		

        }
        
        public object Load(int key,Type type)
        {
			//tableInfo tableInfo = diccionario.getInfo(model);
			
			tableInfo nombreTabla = new tableInfo(type);
			
			IDbCommand comando = nombreTabla.GetSelectCommand(key);
			//IDataReader dataReader = nombreTabla.GetSelectCommand(key).ExecuteReader();
			IDataReader dataReader = comando.ExecuteReader();
			dataReader.Read(); //leemos el primer registro (y único)
			
			
			object objeto = Activator.CreateInstance(type);
			nombreTabla.PrimaryKey.SetValue(objeto, dataReader[nombreTabla.PrimaryKey.Name.ToLower()], null);
			
			foreach(PropertyInfo propiedad in nombreTabla.Fields )
				propiedad.SetValue(objeto, dataReader[propiedad.Name.ToLower()], null);
			
			dataReader.Close();
			
			return objeto;
        }
		
		public void Delete(int key, Type type)
		{
			tableInfo nombreTabla = new tableInfo(type);
			
			IDbCommand comando = nombreTabla.GetDeleteCommand(key);
			
			comando.ExecuteNonQuery();
		}
	}
}